package JDK8新性质.引用.Lambda表达式;

public class Test {
    public static void main(String[] args) {
        // 目标: 认识Lambda表达式

        // 原来写匿名内部类
//        Animal a = new Animal() {
//
//            @Override
//            public void run() {
//                System.out.println("狗跑的飞快~~~");
//            }
//        };
//        a.run();

        // 注意: Lambda表达式并不是说能简化全部匿名内部类的写法,只能简化函数式接口的匿名内部类.  (函数式接口: 是接口,并且有且仅有一个抽象方法)
        // 错误的代码
//        Animal a = () -> {
//            System.out.println("狗跑的飞快~~~");
//        };
//        a.run();

        // 正确的Lambda表达式
        Swimming s = () -> {
            System.out.println("学生快乐的游泳~~~");
        };
        s.swim();

        // Lambda表达式的进一步省略写法
        //1. 参数类型可以不屑
//      例如:
//      Swimming s = (int a) -> {                                    Swimming s = (a) -> {
//            System.out.println("学生快乐的游泳~~~");                        System.out.println("学生快乐的游泳");
//        };                                             ----->         };
//        s.swim();                                                     s.swim();

        // 2. 如果只有一个参数.参数类型可以省略,同时()也可以省略.
//        Swimming s = a -> {
//            System.out.println("学生快乐的游泳~~~");
//        };
//        s.swim();

        // 3. 如果Lambda表达式中的方法体代码只有一行代码,可以省略大括号不写, 同时要省略分号! 此时如果这行代码是return语句, 也必须去掉return不写.
//        Swimming s =  a -> System.out.println("学生快乐的游泳~~~");
//        s.swim();
    }
}

interface Swimming {
    void swim();
}

abstract class Animal {
    public abstract void run();
}
